package com.wxxymaker.edu.model.dao;

import com.blade.ioc.annotation.Bean;
import com.wxxymaker.edu.model.entity.User;
import com.wxxymaker.edu.model.entity.UserToken;
import com.wxxymaker.edu.utils.Const;
import com.wxxymaker.edu.utils.TimeUtils;
import io.github.biezhi.anima.Anima;
import io.github.biezhi.anima.enums.OrderBy;

import java.util.List;

/**
 * @AUTHOR soft
 * @DATE 2018/9/4 17:03
 * @DESCRIBE token操作工具和数据库相关联
 */
@Bean
public class UserTokenDao implements BaseDao<UserToken> {

    /**
     * 根据用户获取一个Token
     * @param user 用户
     * @return token
     */
    public UserToken byUser(User user) {
        return Anima.select().from(UserToken.class)
                .where(UserToken::getUserId, user.getId())
                .order(UserToken::getEndTime, OrderBy.DESC)
                .one();
    }

    /**
     * 获取用户没有过期的token
     * @param user 用户 必须有id
     * @return 没有过期的Token, 或者null
     */
    public UserToken getTokenByUserNoOver(User user) {
        return Anima.select().from(UserToken.class)
                .where(UserToken::getUserId, user.getId())
                .where(UserToken::getEndTime)
                .gt(TimeUtils.getTime())
                .order(UserToken::getEndTime, OrderBy.DESC)
                .one();
    }

    /**
     * 获取所有过期的token记录
     * @return 记录列表
     */
    public List<UserToken> getFormOverTime() {
        return Anima.select().from(UserToken.class)
                .where(UserToken::getEndTime)
                .lte(TimeUtils.getTime())
                .all();
    }

    /**
     * 根据token值获取token对象
     * @param token    token值
     * @param joinUser 是否关联用户
     * @return token对象
     */
    public UserToken byToken(String token, boolean joinUser) {
        UserToken userToken = Anima.select().from(UserToken.class)
                .where(UserToken::getToken, token).one();
        if (userToken != null) {
            if (joinUser) {
                User user = Anima.select().from(User.class).byId(userToken.getUserId());
                userToken.setUser(user);
            }
            return userToken;
        }
        return null;
    }

    /**
     * 添加一个token 同时指定token失效时间
     * 默认失效时间为三天后
     * @param userToken token对象
     * @param limit 保存时长 单位(天)
     * @return 带id的userToken对象
     */
    public UserToken add(UserToken userToken, long limit) {
        if (userToken != null) {
            userToken.setCreateTime(TimeUtils.getTime());
            userToken.setEndTime(TimeUtils.getTime(limit));

            Long pk = userToken.save().asLong();
            if (pk != null) {
                userToken.setId(pk);
                return userToken;
            }
        }
        return null;
    }

    @Override
    public UserToken add(UserToken userToken) {
        return this.add(userToken, Const.tokenLimit);
    }

    @Override
    public UserToken delete(Object pk) {
        UserToken userToken = this.byId(pk);
        if (userToken != null) {
            if (Anima.deleteById(UserToken.class, (Long) pk) > 0) {
                return userToken;
            }
        }
        return null;
    }

    @Override
    public boolean change(UserToken userToken) {
        return userToken.updateById(userToken.getId()) > 0;
    }

    @Override
    public UserToken byId(Object pk) {
        return Anima.select().from(UserToken.class).byId(pk);
    }
}
